package org.ziegler.log.analysis.core;

import java.io.BufferedReader;
import java.io.Closeable;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

/**
 * 文本格式的文件，逐行解析。
 *
 * 一次循环读入所有行，逐行解析每一行数据，并返回解析后的数据列表。
 *
 * @author Ziegler
 * @date 2020/7/9 21:41
 */
public class ParseReader<R> implements Closeable {

    private final FileReader fileReader;

    private final BufferedReader bufferedReader;

    public ParseReader(String fileName) throws IOException {
        this(new File(fileName));
    }

    public ParseReader(File file) throws IOException {
        fileReader = new FileReader(file);
        bufferedReader = new BufferedReader(fileReader);
    }

    public ParseReader(String fileName, Charset charset) throws IOException {
        this(new File(fileName), charset);
    }

    public ParseReader(File file, Charset charset) throws IOException {
        fileReader = new FileReader(file, charset);
        bufferedReader = new BufferedReader(fileReader);
    }

    /**
     * 载入文件数据，并逐行读取，并解析，返回解析后的数据列表
     * @param parseFunc 解析函数
     * @return 解析后的数据列表
     * @throws IOException 可能读取数据失败
     */
    public List<R> load(final Function<String, R> parseFunc) throws IOException {
        final List<R> allLine = new ArrayList<>();

        String str = bufferedReader.readLine();
        while (str != null) {
            allLine.add(parseFunc.apply(str));

            // 读取下一行
            str = bufferedReader.readLine();
        }

        return allLine;
    }

    @Override
    public void close() throws IOException {
        bufferedReader.close();
        fileReader.close();
    }
}
